package bancosys.tec.services.implementor.descriptor;

import java.util.List;

import jmine.tec.di.metadata.DependencyMetaData;
import jmine.tec.di.scope.TypedScope;
import jmine.tec.di.type.TypeConvertionException;

/**
 * Inteface para os geradores de servico. Responsável por resolver as dependências do construtor, validar os parâmetros requeridos e
 * construir o objeto de servico.
 * 
 * @author MarceloT
 */
public interface InstanceCreator {

    /**
     * Hidrata as dependencias e constroi o servico. Pode devolver null se alguma propriedade não é satisfeita.
     * 
     * @param properties as propriedades
     * @return {@link Object} o servico {@inheritDoc}
     * @throws TypeConvertionException e
     */
    Object hydrateAndCreateInstance(TypedScope properties) throws TypeConvertionException;

    /**
     * Invoca os validadores
     * 
     * @param properties o {@link TypedScope}
     * @return {@link List}
     */
    List<String> validateRequiredProperties(TypedScope properties);

    /**
     * Devolve a lista de dependencias. Modificacoes nesta lista nao refletem o estado deste {@link InstanceCreator}
     * 
     * @return the list of dependencies
     */
    List<DependencyMetaData> getDependencies();

}
